{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "另外一种向量化操作的方法是利用 NumPy 的广播功能。广播可以简单理解为用于不同大\n",
    "小数组的二进制通用函数（加、减、乘等）的一组规则"
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "source": [
    "import numpy as np\n",
    "a = np.array([0,1,2])\n",
    "b = np.array([5,5,5])\n",
    "a+b"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([5, 6, 7])"
      ]
     },
     "metadata": {},
     "execution_count": 24
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "广播允许这些二进制操作可以用于不同大小的数组。例如，可以简单地将一个标量（可以\n",
    "认为是一个零维的数组）和一个数组相加："
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "source": [
    "a  + 5   #我们可以认为这个操作是将数值 5 扩展或重复至数组 [5, 5, 5]，然后执行加法。NumPy广播功能的好处是，这种对值的重复实际上并没有发生，但是这是一种很好用的理解广播的模型。"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([5, 6, 7])"
      ]
     },
     "metadata": {},
     "execution_count": 25
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "source": [
    "M = np.ones((3,3))\n",
    "M"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[1., 1., 1.],\n",
       "       [1., 1., 1.],\n",
       "       [1., 1., 1.]])"
      ]
     },
     "metadata": {},
     "execution_count": 26
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "source": [
    "M + a"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[1., 2., 3.],\n",
       "       [1., 2., 3.],\n",
       "       [1., 2., 3.]])"
      ]
     },
     "metadata": {},
     "execution_count": 27
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "source": [
    "a = np.arange(3)\n",
    "b = np.arange(3)[:, np.newaxis]\n",
    "print(a)\n",
    "print(b)"
   ],
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[0 1 2]\n",
      "[[0]\n",
      " [1]\n",
      " [2]]\n"
     ]
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "source": [
    "a + b"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[0, 1, 2],\n",
       "       [1, 2, 3],\n",
       "       [2, 3, 4]])"
      ]
     },
     "metadata": {},
     "execution_count": 29
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "![](2021-10-31-19-52-09.png)"
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "source": [
    "M = np.ones(((2,3)))\n",
    "a = np.arange(3)\n",
    "M + a"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[1., 2., 3.],\n",
       "       [1., 2., 3.]])"
      ]
     },
     "metadata": {},
     "execution_count": 30
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "source": [
    "a = np.arange(3).reshape((3,1))\n",
    "b = np.arange(3)\n",
    "a + b"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[0, 1, 2],\n",
       "       [1, 2, 3],\n",
       "       [2, 3, 4]])"
      ]
     },
     "metadata": {},
     "execution_count": 31
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "source": [
    "M = np.ones((3,2)) \n",
    "a = np.arange(3)   #由于广播只能左补1，因此，维度不匹配，会报错\n",
    "M + a[:,np.newaxis]  #设定右边补1，就不会报错"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[1., 1.],\n",
       "       [2., 2.],\n",
       "       [3., 3.]])"
      ]
     },
     "metadata": {},
     "execution_count": 32
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "广播的实际应用\n",
    "1. 数组的归一化\n",
    "2. 画一个二维函数\n"
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "source": [
    "X = np.random.random((10,3))\n",
    "Xmean = X.mean(0)\n",
    "Xmean\n",
    "X_centered = X - Xmean\n",
    "X_centered"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[-0.16217148, -0.30908999, -0.29023954],\n",
       "       [ 0.15220295,  0.39888063,  0.09337735],\n",
       "       [-0.43795078, -0.31206927,  0.37381694],\n",
       "       [ 0.41947544,  0.17493877, -0.06295571],\n",
       "       [ 0.47335712,  0.3828132 , -0.14933838],\n",
       "       [-0.07638025, -0.04838649,  0.18236031],\n",
       "       [-0.10066864, -0.10695055,  0.3940807 ],\n",
       "       [ 0.41304409, -0.38399166, -0.26751812],\n",
       "       [-0.44726074,  0.02890866, -0.02790929],\n",
       "       [-0.2336477 ,  0.17494669, -0.24567425]])"
      ]
     },
     "metadata": {},
     "execution_count": 33
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "source": [
    "x = np.linspace(0, 5, 50)\n",
    "y = np.linspace(0,5,50)[:,np.newaxis]\n",
    "z = np.sin(x)**10+np.cos(10+y*x)*np.cos(x)\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "plt.imshow(z,origin='lower',extent=[0,5,0,5], cmap='viridis')\n",
    "plt.colorbar()"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "<matplotlib.colorbar.Colorbar at 0x7fef0368bfa0>"
      ]
     },
     "metadata": {},
     "execution_count": 34
    },
    {
     "output_type": "display_data",
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     }
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "比较、掩码和布尔逻辑\n",
    "当你想基于某些准则来抽取、修改、计数或对一个数组中的值进行其他操作时，掩码就可以派上用场了。例如你可能希望统计数组中有多少值大于某一个给定值，或者删除所有超出某些门限值的异常点。在NumPy中，布尔掩码通常是完成这类任务的最高效方式.\n",
    "NumPy还实现了如<（小于）和>（大于）的逐元素比较的通用函数。"
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "source": [
    "x = np.arange(1,6)\n",
    "x < 3"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([ True,  True, False, False, False])"
      ]
     },
     "metadata": {},
     "execution_count": 35
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "source": [
    "(2*x) == (x**2)"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([False,  True, False, False, False])"
      ]
     },
     "metadata": {},
     "execution_count": 36
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "![](2021-10-31-20-19-29.png)"
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "source": [
    "rng = np.random.RandomState(0)  #是一个伪随机数生成器\n",
    "x = rng.randint(10,size=(3,4))\n",
    "x"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[5, 0, 3, 3],\n",
       "       [7, 9, 3, 5],\n",
       "       [2, 4, 7, 6]])"
      ]
     },
     "metadata": {},
     "execution_count": 37
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "source": [
    "x < 6"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[ True,  True,  True,  True],\n",
       "       [False, False,  True,  True],\n",
       "       [ True,  True, False, False]])"
      ]
     },
     "metadata": {},
     "execution_count": 38
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "source": [
    "np.count_nonzero(x<6)"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "metadata": {},
     "execution_count": 39
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "source": [
    "np.sum(x<6)"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "metadata": {},
     "execution_count": 40
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "source": [
    "np.sum(x<6,axis=1)  #sum()的好处是，和其他NumPy聚合函数一样，这个求和也可以沿着行或列进行："
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([4, 2, 2])"
      ]
     },
     "metadata": {},
     "execution_count": 41
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "source": [
    "#如要快速检查任意或者所有这些值是否为True，可以用（你一定猜到了）np.any()或np.all()\n",
    "np.any(x>8)"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "metadata": {},
     "execution_count": 42
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "source": [
    "np.all(x<10)"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "metadata": {},
     "execution_count": 43
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "source": [
    "np.all(x<8,axis=1)  #np.all()和np.any()也可以用于沿着特定的坐标轴"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([ True, False,  True])"
      ]
     },
     "metadata": {},
     "execution_count": 44
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "这可以通过Python的逐位逻辑运算符（bitwise logic operator）&、|、^和~来实现。同标准的算术运算符一样，NumPy用通用函数重载了这些逻辑运算符，这样可以实现数组的逐位运算（通常是布尔运算）。"
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "source": [
    "np.sum((inches > 0.5) & (inches < 1))"
   ],
   "outputs": [
    {
     "output_type": "error",
     "ename": "NameError",
     "evalue": "name 'inches' is not defined",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_14002/873035803.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minches\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0.5\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m&\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0minches\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m: name 'inches' is not defined"
     ]
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "将布尔数组作为掩码\n",
    "一种更强大的模式是使用布尔数组作为掩码，通过该掩码选择数据的子数据集。"
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "x[x<5]"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([0, 3, 3, 3, 2, 4])"
      ]
     },
     "metadata": {},
     "execution_count": 31
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "花哨的索引\n",
    "在前面的小节中，我们看到了如何利用简单的索引值（如arr[0]）、切片（如arr[:5]）和布尔掩码（如arr[arr  >  0]）获得并修改部分数组。在这一节中，我们将介绍另外一种数组索引，也称作花哨的索引（fancy indexing）。花哨的索引和前面那些简单的索引非常类似，但是传递的是索引数组，而不是单个标量。花哨的索引让我们能够快速获得并修改复杂的数组值的子数据集。"
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "rand = np.random.RandomState(42)\n",
    "x = rand.randint(100,size=10)\n",
    "x"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([51, 92, 14, 71, 60, 20, 82, 86, 74, 74])"
      ]
     },
     "metadata": {},
     "execution_count": 32
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "[x[3],x[7],x[2]]"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "[71, 86, 14]"
      ]
     },
     "metadata": {},
     "execution_count": 33
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "ind = [3,7,4]  #利用花哨的索引，结果的形状与索引数组的形状一致，而不是与被索引数组的形状一致\n",
    "x[ind]"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([71, 86, 60])"
      ]
     },
     "metadata": {},
     "execution_count": 34
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "ind = np.array([[3,7],\n",
    "                                [4,5]])\n",
    "x[ind]"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[71, 86],\n",
       "       [60, 20]])"
      ]
     },
     "metadata": {},
     "execution_count": 35
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "X = np.arange(12).reshape((3,4))\n",
    "X"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11]])"
      ]
     },
     "metadata": {},
     "execution_count": 36
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "row = np.array([0,1,2])\n",
    "col = np.array([2,1,3])\n",
    "X[row,col]\n",
    "\n",
    "#这里需要注意，结果的第一个值是X[0,  2]，第二个值是X[1,  1]，第三个值是X[2,  3]。在花哨的索引中，索引值的配对遵循2.5节介绍过的广播的规则。因此当我们将一个列向量和一个行向量组合在一个索引中时，会得到一个二维的结果"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([ 2,  5, 11])"
      ]
     },
     "metadata": {},
     "execution_count": 37
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "X[row[:,np.newaxis],col]"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[ 2,  1,  3],\n",
       "       [ 6,  5,  7],\n",
       "       [10,  9, 11]])"
      ]
     },
     "metadata": {},
     "execution_count": 38
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "X[2, [2,0,1]]"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([10,  8,  9])"
      ]
     },
     "metadata": {},
     "execution_count": 39
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "X[1:,[2,0,1]]"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[ 6,  4,  5],\n",
       "       [10,  8,  9]])"
      ]
     },
     "metadata": {},
     "execution_count": 40
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "mask = np.array([1,0,1,0],dtype=bool)\n",
    "X[row[:,np.newaxis],mask]  #更可以将花哨的索引和掩码组合使用："
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[ 0,  2],\n",
       "       [ 4,  6],\n",
       "       [ 8, 10]])"
      ]
     },
     "metadata": {},
     "execution_count": 43
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "mean = [0,0]\n",
    "cov = [[1,2],\n",
    "                [2,5]]\n",
    "X = rand.multivariate_normal(mean,cov,100)\n",
    "X.shape"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "(100, 2)"
      ]
     },
     "metadata": {},
     "execution_count": 44
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "%matplotlib inline\n",
    "import seaborn; seaborn.set()\n",
    "plt.scatter(X[:,0], X[:,1])"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7fce36d33ee0>"
      ]
     },
     "metadata": {},
     "execution_count": 46
    },
    {
     "output_type": "display_data",
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD7CAYAAAB+B7/XAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAfN0lEQVR4nO3dfXBU5b0H8O/u5lWS3CRLMLTBl0ZeQrxKr3QwpWMCthPQECQzFrCg3opep+OU2zti0Zm2Io4Q8aXeArW3IwYQaccOhCEIghfMCERKuRQhaIRMtLRhJSxhQjBsSHbvH7jb7O45Z8/Z8+yes0++nxlnYDfn2ecJ8Xue/M5znuMIBAIBEBGRNJxWd4CIiMRisBMRSYbBTkQkGQY7EZFkGOxERJJhsBMRSYbBTkQkmTSrOxDU3X0Zfn/8S+rd7hx4vb0Ce2Qvso8P4BhlwTEmh9PpQEHBCMX3bBPsfn/AVLAH25CZ7OMDOEZZcIzWYimGiEgyDHYiIskw2ImIJCOsxu7z+fDCCy+gpaUFmZmZmDRpEpYvXy6qeSIi0klYsK9atQqZmZl477334HA4cP78eVFNExHZTkurB1ua2+Ht8cGdl4m6ylJUlBcn7XgtQoL98uXLaGxsRHNzMxwOBwBg5MiRIpomIrKdD46cwfqdn6J/wA8A8Pb4sH7npwCgK5xbWj2mjo9FSLCfOXMG+fn5WL16NQ4dOoQRI0Zg8eLFmDx5su423O4c0/0oKso13YadyT4+gGOUhexj3PC7llAoB/UP+NG4vwO1VWNjHt+439zxsQgJ9sHBQZw5cwYTJ07Ez3/+cxw7dgyPP/449uzZg5wcfYHt9faaWhdaVJSLrq5LcR9vd7KPD+AYZTEcxni+u0/x9a7uPl1j7zJ5PHDtBiW1CbGQVTGjR49GWloaampqAAC33347CgoK0NHRIaJ5IiJbGVmQrfi6Oy9T1/FqX6f3+FiEBHthYSGmTJmCAwcOAAA6Ojrg9Xpx4403imieiMhWHpxZhoy08PjMSHOirrJU1/F1laWmjo9F2KqYZcuW4ZlnnkF9fT3S0tLw4osvIi8vT1TzRES2UXXHGPRcuhL3qpbg1yVqVYzDLg+zZo1dm+zjAzhGWXCMyZHwGjsREdkHg52ISDIMdiIiyTDYiYgkw2AnIpIMg52ISDIMdiIiyTDYiYgkw2AnIpIMg52ISDIMdiIiyTDYiYgkw2AnIpIMg52ISDIMdiIiyTDYiYgkw2AnIpIMg52ISDIMdiIiyTDYiYgkIzzYV69ejfHjx+Ozzz4T3TQREekgNNhbW1vx17/+Fd/85jdFNktERAYIC/b+/n4899xzePbZZ0U1SUREcUgT1dBrr72G2tpalJSUxHW8251jug9FRbmm27Az2ccHcIyy4BitJSTYjx49ihMnTuDJJ5+Muw2vtxd+fyDu44uKctHVdSnu4+1O9vEBHKMsOMbkcDodqhNiIaWYw4cPo729HXfffTemT58Oj8eDRx55BPv37xfRPBERGSBkxv7YY4/hscceC/19+vTpeP311zFu3DgRzRMRkQHCauxENHy1tHqwpbkd3h4figqycd/3bkZFebHV3Rq2EhLse/fuTUSzRGRDLa0erN/5KfoH/ACAru4+rN/5KQAw3C3CGTsR6TZ0Zu7Oy0RdZSm2NLeHQj2of8CPLc3tDHaLMNiJSJfImbm3x4ffbz+p+vXeHl+yukYRuFcMEemiNDPX4s7LTGBvSAuDnYh0MTIDz0hzoq6yNIG9IS0sxRCRLu68TF3hbnZVjFIdn7V6YxjsRKRLXWVpWI09kjsvE6t+MtXUXZlKdXyusDGOwU5EYdRmzMFg3fz+Z+jtGwg7RlTphStsxGCwE1FIrBlz8L9ElUvUSj16SkAs4fwTg52IQvTOmIfO4EVSq+PHWmGjthTz9N8vYmH1BOH9tDuuiiGiEDMzZhHqKkuRkRYeS3rKPGpLMfcd7URLq0doH1MBg52IQtRmxslak15RXoyHZk4IfZ47LxMPzZwQ87cDrRPPluZ2oX1MBSzFEFGI0sqXZK9Jj6fMo7UUczjeAcsZOxGFxDtjtprWiWc43gHLGTsRhYn3wmhwVcqFHh8Kk7wqpaK8GKf/fhH7jnaGvT5c74BlsBORaXa4sWhh9QTcUpLPJY9gsBORAHa5sShRyzBTDYOdKMUYuREnWTft8MKlvTDYiVKIkZJHMssjI7JcuHxlMOr1zHSHqXZ5N2l8uCqGKIVolTzMfK1ZDodygPuuBuK+QSh4YgrO+oMnpuF4w5FRDHaiFGKk5JHM8kjkpmBDxXsiSeaJSTZCSjHd3d146qmn8Le//Q0ZGRm48cYb8dxzz6GwsFBE80TDjloJwsheKvHuuxKPRNwgZKQ9lmzCCZmxOxwOLFq0CO+99x62b9+OMWPG4KWXXhLRNNGwo1WCMLKXSrz7rrS0erBk7QH8eOVeLKrfix+v3Islaw9olkC02nQ6EFf5RO/2BizZRBMS7Pn5+ZgyZUro75MmTUJnZ6fGEUSkJtbSQa07Q4eG8pbmdkz912JDd5FGhqQ/cO31WGFZUV6Mad/+huJ7/gDiClq9JyaWbKIJXxXj9/uxefNmTJ8+3dBxbneO6c8uKso13YadyT4+gGMEgAsqJYgLPT4UFeWitioXtVVjw9774MgZ/E/jcVz66mroNW+PDwdPfIkn7r8dVXeM0dW3xv0tqk9I6h/wo3F/R9RnB/3Xgu/g38rO4NU/HIU/eEbQeayS2qpc5OVmYcPOT3C+uw8jC7Lx4MyyqLHE+n4lip1/VoUH+/Lly3HddddhwYIFho7zenujfhiMMPM4rlQg+/gAjjGoUKVeXZiXqXhs5LLGoXxXB9HQ1IryG/J19a+ruy/m+1r9L78hHwGV/49jHavWXv1/VIS3E9GG0e+XCHb4WXU6HaoTYqGrYurr6/HFF1/g17/+NZxOLrghiofR2rjaXuRBRi5exrqwqufC68iC7LiPjUe81xJkJix9X3nlFZw4cQJr1qxBRkaGqGaJhh2jOyzGCm4jgaoUkkF6w/LBmWVJDdpU3ZEykYSUYk6dOoXf/e53uOmmmzBv3jwAQElJCdasWSOieaJhx8ieJ1pLDY0GavAzg0sHnY5rFz+NLCGsumMMei5dSeryQ+4RE05IsI8dOxZtbW0imiIa9vSsyR76NSOyXEhzOTAwGF7bHpHlwgM/GK95rFL7IkJSqQ2uNU8e7hVDZCN69neJ/JrLVwbhcgA52Wno7RvQDE2rtte1w7a+wwmDnchG9Gx/q/Q1gwEgM92F/158l+n2E8Eu2/oOFwx2IgtFlif03EZv5tZ9q7bX5ba+ycVgJ7KIUnlCzdCVLXr3gFGqaasdOyLLhSVrD8R9wTQW0fvWsF6vjYvNiSwSa/15UOTKFj3rttX2T7mt1B11rMsB+K76dW8jMHTbglh7yBjps17cGyY2BjuRRbRm6COyXACU12TrWbetVtP+uN0bdWx2VlrUipqhxwzdcyXeUBW51px7w8TGUgyRRbRq6lkZafjNf1aqHhtrSaJWTTvy2B+v3KvZz6FtmbkIKmqtOev1sTHYiSxSV1mK328/qfie2ZASsW+70jF22CM9mfvMpyoGO5FFKsqLsfn9zxSfPmQkpCID9LZSN3xXo58/qlbTvq3UjX1HlbfZjjzGyIXbRK1br6ssjdr0bLjvDROJwU6URB8cOYOGptZQCI8ZlYNPvrgY9XW3lbp1tacUoEohrXUX6oHjyvVxpVm23lBN5Lr1yG0PuComGoOdKElaWj3YsKstNJv29vhUSxsft3t1tfn2njZdK2uyMtIUg09tZc6ILBdW/WRq1Ot6QzXRdXDuDaONwU6UJFua2xVLJEr0BGBLqweXr5hrT+31y1cG0dLqUQxPPaHKOri1uNyRKElE7osOwNDyPr3PD423/UjcI91aDHaiJNE7W9UbgHpPFFrtaX2OmbIJ90i3FksxRElSV1kaVmNXYuRCYGa6S7GtNJcD/zIiQ9eFRVErc9TaZpBbg8FOZJLe9doV5cXIy83Cy2//n2pbShcs1T5T7QQRvIv00VkTdQXr/O+P4/JBybAUQ2SC0Vvsq+4YE1e9O/Iz32hSvrEpyMj+KSybyIczdiIT4lmvbeYGm+CJxK+8tYuhfgzFsolcGOxEJsSzXtvMDTZ6d4TU0w+SF4OdyIR412vHO0M2GtRcNz48Cauxd3R0YO7cuaiursbcuXPx+eefi2qayLaSvV5bLagdjmv7qierH2Rvwmbsv/rVr/DAAw9g9uzZ2LZtG375y19iw4YNoponsiVR+5boXVmjVp9/aOYEIf0gOTgCgYCOyzDavF4vqqurcejQIbhcLgwODmLKlCnYvXs3CgsLdbbRC7+eK0Iqiopy0dV1Ke7j7U728QHyj7Gl1YPG/R3o6u4LC97IjbyAf4a1UjDb/bFwsv87AvYYo9PpgNudo/iekBn72bNncf3118PluvbUF5fLhVGjRuHs2bO6g12tg0YUFeWabsPOZB8fIO8YPzhyJmoDsA272pCXm4XG/R2KK2sa93egtmpsVFu1VbmKr9uJrP+OQ9l5jLa5eMoZuzbZxwfIPcaGptaoG4p8VwdDW/gq6eruS/j3IxGzf5n/HYPsMMaEz9hHjx6NL7/8EoODg6FSzLlz5zB69GgRzRMJY1UZI55lkYle0ZLIh2GQtYSsinG73SgrK0NTUxMAoKmpCWVlZbrLMETJ0NLqwbqmk2F3ia5rOpmUp9sbDelkrGjhQ6HlJawU8+yzz2Lp0qVYu3Yt8vLyUF9fL6ppIsOUZuZv72nDYES1bzBw7WEViZ6hKq1mUZOs3yT4UGh5CQv20tJSvPPOO6KaI4qbWolBLVSVHlYhumQTPDa4KkaL3o3AzOLDMORlm4unRKKolRj0SlTtuaK8GLVVY/Hwsl2qs+JYoSryhMOHQsuLuzuSdIyWEnKyw+c3ia4911WWIi3yNtGvaT3E2uhOkrFwV0d5ccZO0lErMYzIcsF31R/arxy49lCK+d8fF/Z1WrXnJWsPGJ4lD51lFxVk477v3Yx/v6cMG3Z9At/V8KL/geMe3FKSr/vB00Z2cFTCXR3lxGCnlKZUmlArMTzwg/EAYt92r3ZiAIyXZSLLOl3dfVi/81M8NHMCcrIz4Lsa/jlaQW32Yqfd71glcRjslLLUauEPzZyAh2ZOUA2xWGEWawWLkVmy1izbaFCbudjJNevDC4OdbCvWDFMrNFf9ZKqp8kSwfbOzZK3jjQa1mYudiSjjkH3x4inZkp4LhVauw9a7JFDrMXhGt/w1c7GTa9aHF87YyZb0zDATtQ5babfFoYwsCdSaZcez5W+8Fzu5Zn14YbCTMCIvzumZYSZqHbbW4+dystMw//vjdI8rMryDq2KG1vuTUQrhmvXhhcFOQsRzcS7yRPBwTTnKb8gHoL0ypaXVExaIold6aJUnMtNdhtsf2lerdgVM1PeK7InBTkIYvTindCJY/c4xPDhjPCrKi1FXWYrfbz+p+lmJnPHGWu6YqrhmffjgxVMSwmgQKp0IfFcHQ3d3agVQosNVqzyhVpNuafVgydoD+PHKvViy9kBSdowkUsMZOwlh9OKcnhNBIi+OapUkKsqLcfrvF7HvaGfYcWo1aa4RJ7vhjJ2EUFq6B/zzNvzIGazWMkCtNs1e8NO738rC6gl4dNZEXUsLua852Q1n7CSE1k09SjNYpVUamemusNA2esFPz6ocI9cC9NakZazHU2pjsJMwwSBcsvZAVKhFhqdSaA9dFRPZZix6yyGJCGG1klHkrpFEycKfPBJOb3hGhraZpYB6Z+KJqNvXVZbizXc/Cds1EgD6rgyElmYSJRNr7CTciCyX4uuJvMtR78kknrp9rBUvFeXFyEyP/l9pMADW2ckSnLGTUC2tHviuRt+16XJoLyPUak9PjV3vTDy44qX5r53wBwCnA5j6r+rlHr0lHqXH6wW/nijZGOwk1Jbm9qiSBABkZ137UQvW3/Xc+WhkGaHeW+ZbWj04cNwD/9dd9Afie7jFG00nw/rBvVjITkyXYpYtW4YZM2agtrYW8+bNw/Hjx0X0i1KU2gy1t2/A8GPdtEJ16HHBWX3/gB/Or584p7Y80ejSRLXx+AMI638ilmYSxcv0jP2uu+7CM888g/T0dOzbtw8/+9nP8P7774voG6UgtZmrA9EPlI61H3isUA0aOlP3B6J3T9TTptGHWwztP4CwE4s/AO7FQpYyHezTpk0L/XnSpEnweDzw+/1wOnldNpXFu1Oj2gqR6OLMNVo1aL2hauSEIeLhFpH9N3JiIUoGoTX2TZs2oaqqKq5Qd7tzTH9+UVGu6TbsLFnj++DIGWzY1Qbf1WsXBL09PmzY1Ya83CxU3TFG89jaqlz84X9P4dJXV3V9VlFBdti4hv754ZpyrH7nWKgfkS5onBQu9PgUv19KbWamu/BwTbni19dW5SIvNwuv/uEo/P7o05PT6VA8sTTu70Bt1VjFvsn+cwpwjFaLGexz5sxBZ2en4nsHDx6Ey3VtaduOHTuwfft2bNq0Ka6OeL29iv/j6GXVdqjJkszxNTS1RoWp7+ogGppao24gUqI31DPSnLjvezeHxhU5xvIb8vHgjPF4o+kklH40Cr+eZSvNwAvzMhW/X8E2I38bKb8hX/X7W35DPh65t0zx4qzaTL6ru0+xPdl/TgGOMVmcTofqhDhmsG/dujXmB+zZswevvvoqGhoaMHLkSOM9JFsxe3emVgll6NcMLVe0tHrQuL8FXd19Ye8F39da8WL0ARLxbF+rtr2B2nNRuRqGrGS6FLNv3z6sWLECb775JkpKSkT0iSxmdulerLq0Oy8Tq34yNfT3WMsag6H69p620HrxjK9vCErmAyTUTgh8MhHZjelgf/rpp5Geno6f/vSnodcaGhpQUFBgtmmyiNnHqAXDT+1BGZEnDb3bAVwd+Gc9Jrh8Mvh5Vl2o5JOJyI5MB/tHH30koh9kIyLCqqK8WHeZQk/px+gTmpKJTyYiu+Gdp6RIT1jFWhKpd+avp/TDrXGJ9GOwJ1G8a8PtSM/t/npn/npOALxln0g/BnuSyPb4NL2lET0z/+D7jfs7olbFBJmt+xMNJwz2JLFzjTgeoksjFeXFqK0aq7o2WG32DxjbWIxoOGCwJ4lsNWKzpRGlslRtlfadfJGzf9l+CyIShcGeJImuESe7fm+mNKIWyHm5WbrubA2S7bcgIlG4U1eSJHJb12BQGtkSV4T0NEfozznZaYrb5CpRC+QNOz9R/Hq1JxjJ9lsQkSicsSdJIm9kSfbMNXLGDQD9Ck9NUqMWvOe7+2J+1tByC1fKECljsCdRom5kSfbM1eyJRC2QRxZkG/osrpQhUsZSjATUZqiJmrmaPZGolaUenFlm6LMqyovx0MwJoXGqPTWJaLjhjF0CImeuei7Cmi2BqJWlqu4YE7XcMdZn8XZ+omgMdgmIqt/rXT4o4kSiN5BZbiEyjsEuCREzVyN3kwa/Phlb5Sbrs4hkwWCnECO182SWQFhuITKGF08pJNkXYYkoMThjT1GJuNOU9WwiOTDYU1Ci9khhPZtIDgz2FJTIO01ZzyZKfayxpyDukUJEWhjsKYgXOYlIi7BgP3ToEMrKyvDWW2+JapJUJHKnSCJKfUJq7L29vXjppZdw1113iWiOYuBFTiLSIiTYV65ciUceeQQffPCBiOZIB17kJCI1poO9ubkZly5dwowZM0wFu9udY7YrKCrSfrRaqpN9fADHKAuO0Voxg33OnDno7OxUfG/Xrl14+eWX8eabb5ruiNfbC78/EPfxRUW5qg9CloHs4wM4RllwjMnhdDpUJ8Qxg33r1q2q7/3lL39BV1cX7r//fgBAd3c39u3bh4sXL+KJJ56Is7tERGSGqVLM5MmT0dLSEvr70qVLceutt2LBggWmO0ZERPHhOnYiIskI3VJg5cqVIpsjIqI4cMZORCQZBjsRkWQY7EREkmGwExFJhsFORCQZBjsRkWQY7EREkmGwExFJhsFORCQZBjsRkWQY7EREkmGwExFJhsFORCQZBjsRkWQY7EREkhG6H7vsWlo92NLcDm+PD+68TNRVlqKivNjqbhERhWGw69TS6sH6nZ+if8APAPD2+LB+56cAwHAnIlthKUanLc3toVAP6h/wY0tzu0U9IiJSxmDXydvjM/Q6EZFVGOw6ufMyDb1ORGQVITX2jRs3YtOmTUhPT4fT6cS2bdtENKsp8kLmwzXlKL8hP2GfV1dZGlZjB4CMNCfqKksT9plERPEwHey7d+/Grl278Kc//Qk5OTk4f/68iH5pUrqQufqdY3hwxnjhFzKHnkBystOQnubA5SuDXBVDRLZlOtjXrVuHxYsXIycnBwAwcuRI052KRelCpu/qILY0twsN2sgTSG/fADLSnHh01kQGOhHZlulgb29vx7Fjx/Daa6+hv78f8+bNww9/+EPD7bjdObq/9oLKBcsLPT4UFeUa/mw1jftbFFfCNO7vQG3VWGGfo5fIsdkVxygHjtFaMYN9zpw56OzsVHzv4MGDGBwcxNmzZ/H222+ju7sb8+fPx80334zvfOc7hjri9fbC7w/o+trCvEzF1SiFeZno6rpk6HO1dHX3qb4u8nP0KCrKTfpnJhvHKAeOMTmcTofqhDhmsG/dulXz/W984xuoqamB0+mE2+3Gd7/7XXz88ceGg90IpQuZmeku4Rcy3SonEK6EISI7M73csaamBh9++CEA4KuvvsKRI0cwYcIE0x3TUlFejIdmTggFrDsvE0/cf7vwunddZSky0sK/RVwJQ0R2Z7rG/vDDD+MXv/gF7r33XgDA7NmzMXXqVNMdi6WivDgsyBPxq1Gwfe4PQ0SpxHSwZ2VlYdWqVSL6YkuRJxAiIrvjnadERJJhsBMRSYbBTkQkGQY7EZFkGOxERJJhsBMRSYbBTkQkGQY7EZFkGOxERJJhsBMRSYbBTkQkGQY7EZFkGOxERJJhsBMRSYbBTkQkGdP7saeillYPH55BRNIadsHe0uoJe16qt8eH9Ts/BQCGOxFJYdiVYrY0t4c9BBsA+gf82NLcblGPiIjEGnbB7u3xGXqdiCjVDLtgd+dlGnqdiCjVmA72jo4OLFy4ELNnz8bMmTPxm9/8RkS/EqaushQZaeHDzkhzoq6y1KIeERGJZfri6apVq1BdXY0FCxbg8uXLqKmpQWVlJW677TYR/RMueIGUq2KISFamg93hcODSpUsAgCtXrsDhcKCwsNB0xxKporyYQU5E0nIEAoGAmQb+8Y9/4PHHH8fFixfR09ODp556Cj/60Y9E9Y+IiAyKOWOfM2cOOjs7Fd87ePAg/vjHP2L27NlYtGgRzp07h4ULF+LWW2/F7bffbqgjXm8v/P74zzFFRbno6roU9/F2J/v4AI5RFhxjcjidDrjdOYrvxQz2rVu3ar6/ceNGvP/++wCAUaNG4c4778Thw4cNBzsREYlhelVMSUkJPvzwQwBAb28vjhw5grFjx5ruGBERxcf0xdMVK1bg+eefx7p16zAwMIB77rkHlZWVhttxOh1muyKkDTuTfXwAxygLjtHazzd98ZSIiOxl2N15SkQkOwY7EZFkGOxERJJhsBMRSYbBTkQkGQY7EZFkGOxERJJhsBMRSYbBTkQkGamC/be//S1mzZqF++67D7Nnz8a7775rdZeEW7ZsGWbMmIHa2lrMmzcPx48ft7pLQm3btg2zZs3CxIkT8dZbb1ndHaE6Ojowd+5cVFdXY+7cufj888+t7pJQ9fX1mD59OsaPH4/PPvvM6u4kRHd3Nx599FFUV1dj1qxZeOKJJ3DhwgWruxUtIJGenp7Qnz0eT+Db3/524OLFixb2SLy9e/cG+vv7Q3++++67Le6RWG1tbYFTp04FlixZEti4caPV3RFq4cKFgcbGxkAgEAg0NjYGFi5caHGPxDp8+HCgs7MzMG3atEBbW5vV3UmI7u7uwEcffRT6+8qVKwNPP/20hT1SJtWMPTc3N/Tnr776Cg6HA36/38IeiTdt2jSkp6cDACZNmgSPxyPVGMeNG4dbbrkFTqdUP5rwer04efIkampqAAA1NTU4efKkPWd7cZo8eTJGjx5tdTcSKj8/H1OmTAn9fdKkSarPq7CS6d0d7Wbz5s1Yv349PB4PXnjhBRQUFFjdpYTZtGkTqqqqpAtBGZ09exbXX389XC4XAMDlcmHUqFE4e/as7R8lScr8fj82b96M6dOnW92VKCkV7LGe5uRyuTB//nzMnz8fbW1tePLJJ1FRUZFS4a5njACwY8cObN++HZs2bUpm90zTOz4iu1u+fDmuu+46LFiwwOquREmpYI/1NKehxo8fj1GjRuHPf/4zqqurE9grsfSMcc+ePXj11VfR0NCAkSNHJqFX4hj5N5TJ6NGj8eWXX2JwcBAulwuDg4M4d+6c9KULWdXX1+OLL77A66+/bsvfmO3XIxNOnz4d+vOZM2fwySef4JZbbrGwR+Lt27cPK1aswBtvvIGSkhKru0M6ud1ulJWVoampCQDQ1NSEsrIylmFS0CuvvIITJ05gzZo1yMjIsLo7iqR60MbixYtx+vRppKWlweVyYdGiRbjnnnus7pZQd955J9LT08MCoaGhIaXKTVqamprw4osvoqenB+np6cjOzsa6deukOEG3t7dj6dKl6OnpQV5eHurr6/Gtb33L6m4J8/zzz2P37t04f/48CgoKkJ+fjx07dljdLaFOnTqFmpoa3HTTTcjKygJw7fGga9assbhn4aQKdiIikqwUQ0REDHYiIukw2ImIJMNgJyKSDIOdiEgyDHYiIskw2ImIJMNgJyKSzP8D8ai5H1VlziYAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {}
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "indices = np.random.choice(X.shape[0], 20, replace=False)\n",
    "indices"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([54, 19,  5, 88, 15,  3, 96, 93,  9, 75,  4, 73, 59, 47, 56, 68, 42,\n",
       "       98, 45, 40])"
      ]
     },
     "metadata": {},
     "execution_count": 47
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "selection = X[indices]\n",
    "selection.shape"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "(20, 2)"
      ]
     },
     "metadata": {},
     "execution_count": 49
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "source": [
    "plt.scatter(X[:,0],X[:,1],alpha=0.3)\n",
    "plt.scatter(selection[:,0],selection[:,1],\n",
    "                        facecolor='none',edgecolors='b',s=200)"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7fce36a95880>"
      ]
     },
     "metadata": {},
     "execution_count": 53
    },
    {
     "output_type": "display_data",
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {}
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "source": [
    "import numpy as np\n",
    "x = np.arange(10)\n",
    "i = np.array([2,1,8,4])\n",
    "x[i] = 90\n",
    "x"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([ 0, 90, 90,  3, 90,  5,  6,  7, 90,  9])"
      ]
     },
     "metadata": {},
     "execution_count": 46
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "source": [
    "#不过需要注意，操作中重复的索引会导致一些出乎意料的结果产生，如以下例子所示：\n",
    "x = np.zeros(10)\n",
    "x[[0,0]] = [4,6]\n",
    "x"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([6., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
      ]
     },
     "metadata": {},
     "execution_count": 47
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "source": [
    "i = [2,3,3,4,4,4]\n",
    "x[i] += 1\n",
    "x\n",
    "#你可能期望x[3]的值为2，x[4]的值为3，因为这是这些索引值重复的次数。但是为什么结果不同于我们的预想呢？从概念的角度理解，这是因为x[i] += 1是x[i] = x[i] + 1的简写。x[i]  +  1计算后，这个结果被赋值给了x相应的索引值。记住这个原理后，我们却发现数组并没有发生多次累加，而是发生了赋值，显然这不是我们希望的结果。"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([6., 0., 1., 1., 1., 0., 0., 0., 0., 0.])"
      ]
     },
     "metadata": {},
     "execution_count": 48
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "source": [
    "x = np.zeros(10)\n",
    "np.add.at(x,i,1)  #就地操作\n",
    "x"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([0., 0., 1., 2., 3., 0., 0., 0., 0., 0.])"
      ]
     },
     "metadata": {},
     "execution_count": 49
    }
   ],
   "metadata": {}
  }
 ],
 "metadata": {
  "orig_nbformat": 4,
  "language_info": {
   "name": "python",
   "version": "3.8.10",
   "mimetype": "text/x-python",
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "pygments_lexer": "ipython3",
   "nbconvert_exporter": "python",
   "file_extension": ".py"
  },
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3.8.10 64-bit ('d2l-zh': conda)"
  },
  "interpreter": {
   "hash": "0bedf3452ed48e38a2b75ff9f66ce8ae9ae2e92e8665cb618ee0797d2f46b9e5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}